# -*- coding: utf-8 -*-

# Promogest
#
# Copyright (C) 2005,2006,2007,2008,2009,2010,2011,
#                         by Promotux Informatica - http://www.promotux.it/
# Author: Francesco Meloni <francesco@promotux.it>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

import datetime
from promogest.ui.utils import *
from promogest import Environment
from promogest.lib.page import Page
from promogest.lib.webutils import Response, createRandomString
from promogest.dao.Cliente import Cliente
from promogest.modules.InfoPeso.dao.TipoTrattamento import TipoTrattamento
from promogest.modules.InfoPeso.dao.TestataInfoPeso import TestataInfoPeso
from promogest.modules.InfoPeso.dao.RigaInfoPeso import RigaInfoPeso
from promogest.modules.InfoPeso.dao.ClienteGeneralita import ClienteGeneralita

import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt


def infopesoWeb(req, dao=None, action=None, quarto=None):

    def setDao(req, dao=None, id=None, dti=None, dgi=None):
        """ Estensione del SetDao principale"""
        dao_generalita_infopeso= None
        dao_testata_infopeso = None
        if dao:
            if dgi:
                dao_generalita_infopeso = ClienteGeneralita().getRecord(id=dgi)
            else:
                dao_generalita_infopeso = ClienteGeneralita().select(idCliente=dao.id)
                if dao_generalita_infopeso:
                    dao_generalita_infopeso = dao_generalita_infopeso[0]
                else:
                    dao_generalita_infopeso = ClienteGeneralita()
            if dti:
                dao_testata_infopeso = TestataInfoPeso().getRecord(id=dti)
            else:

                dao_testata_infopeso = TestataInfoPeso().select(idCliente=dao.id)
                if dao_testata_infopeso:
                    dao_testata_infopeso = dao_testata_infopeso[0]
                else:
                    dao_testata_infopeso = TestataInfoPeso()
        pageData = {'file': "/giustopeso/infopeso",
                    "dao": dao,
                    "daoCliente": dao,
                    "infopesopage" : "infopesopage",
                    "_dao_": "cliente",
                    "generalita": dao_generalita_infopeso,
                    "testata_infopeso": dao_testata_infopeso,
                    }
        return Page(req).render(pageData)

    def __crea_grafico__(self, dao=None, quarto=None):
        """ TODO: Avvisare con un messaggio quando i dati non sono omogenei
            esempio ci sono più giorni negli scontrini """
        idtip = req.form.get("testata_infopeso_id")
        if idtip != "None":
            tip = TestataInfoPeso().getRecord(id=idtip)
            if len(tip.righeinfopeso) >=1:
                f = plt.figure()
                ax = f.add_subplot(111)
                plt.plot([b.data_registrazione for b in tip.righeinfopeso],
                    [float(a.peso) for a in tip.righeinfopeso], color='#F36717',
                    label='Peso/Data', linewidth=3)

                plt.ylabel('Peso')
                plt.xlabel('Data')

                plt.axis()
                plt.legend()
                f.autofmt_xdate()
                plt.grid(True)


                #try:
                home = os.path.expanduser('~')
                if "www" in str(home):
                    g = ("/home/promo/infopeso/infopeso/core/templates/pdfs/grafico.png")
                else:
                    g = ("/home/promo/infopeso/infopeso/core/templates/pdfs/grafico.png")
                #except:
                    #g = ("/home/promo/infopeso/core/templates/pdfs/grafico.png")
                plt.savefig(g)
                #except:
                    #try:
                        #g = ("/home/gpacer/infopeso/core/templates/pdfs/grafico.png")
                        #plt.savefig(g)
                    #except:
                        #g = ("/home/vete/infopeso/core/templates/pdfs/grafico.png")
                        #plt.savefig(g)

                pageData = {'file': "graficopesate",
                            "dao": dao,
                            "_dao_": "cliente",
                            "h": "/templates/pdfs/grafico.png?" + createRandomString(),
                             "now": datetime.datetime.now()
                            }
            else:
                pageData = {'file': "graficopesate",
                        "dao": dao,
                        "_dao_": "cliente",
                        "h": "",
                         "now": datetime.datetime.now()
                        }
        else:
            pageData = {'file': "graficopesate",
                        "dao": dao,
                        "_dao_": "cliente",
                        "h": "",
                         "now": datetime.datetime.now()
                        }
        return Page(req).render(pageData)

    def prova(d, daos):
        try:
            return str(mN(d.peso- daos.righeinfopeso[daos.righeinfopeso.index(d)+1].peso,3))
        except:
            return "0"

    def __list_row__(req, dao=None, quarto=None):
        testata_infopeso_id = req.args.get("testata_infopeso_id")
        if testata_infopeso_id =="None":
            item= {
            "Result":"OK",
            "Records": []
            }
        else:
            daos = TestataInfoPeso().getRecord(id=testata_infopeso_id)

            item = {
                "Result":"OK",
                "Records": [{ "iprowId": d.id,
                                "iprowDataRegistrazione": "/Date("+str(1000*int(float(d.data_registrazione.strftime('%s') or 0)))+")/",
                                "iprowPeso":str(mN(d.peso,2) or "") ,
                                "iprowDiffPeso":prova(d, daos) ,
                                "iprowMassaGrassa": str(mN(d.massa_grassa,2) or "") ,
                                "iprowMassaGrassaEAcqua": str(mN(d.massa_magra_e_acqua,2) or ""),
                                "iprowAcqua": str(mN(d.acqua,2) or "") ,
                                "iprowTipoTrattamento": str(d.tipotrattamento),
                                "ipRowNote": str(d.note or "")
                                } for d in daos.righeinfopeso]}
        jasoned = json.dumps(item)
        #print jasoned
        return Response(jasoned)

    def __get_trattamenti__(req, dao=None, quarto=None):
        trattamenti = TipoTrattamento().select(batchSize = None)
        item = {"Result":"OK",
            "Options": [{"DisplayText":str(d.denominazione),
            "Value":str(d.denominazione)} for d in trattamenti]}
        jasoned = json.dumps(item)
        return Response(jasoned)

    def __create_row__(req, dao=None, quarto=None):
        """Aggiunge una riga alle pesate"""
        testata_infopeso_id = req.args.get("testata_infopeso_id")
        #dao_tip = TestataInfoPeso().getRecord(id=testata_infopeso_id)
        rp = RigaInfoPeso()
        rp.peso = float(str(req.form.get("iprowPeso").replace(",",".") or 0))
        if req.form.get("iprowMassaGrassa") :
            rp.massa_grassa = float(str(req.form.get("iprowMassaGrassa").replace(",",".") or 0))
        else:
            rp.massa_grassa = 0
        if req.form.get("iprowAcqua"):
            rp.acqua = float(str(req.form.get("iprowAcqua").replace(",",".") or 0))
        else:
            rp.acqua = 0
        if req.form.get("iprowMassaGrassaEAcqua"):
            rp.massa_magra_e_acqua = float(str(req.form.get("iprowMassaGrassaEAcqua").replace(",",".") or 0))
        else:
            rp.massa_magra_e_acqua = 0
        rp.note = str(req.form.get("ipRowNote") or "")
        d= req.form.get("iprowDataRegistrazione").split("-")
        rp.data_registrazione = datetime.datetime(int(d[2]),int(d[1]),int(d[0]))
        dao_tipo_trattamento = TipoTrattamento().select(denominazione= req.form.get("iprowTipoTrattamento"))
        rp.id_tipo_trattamento = dao_tipo_trattamento[0].id
        rp.id_testata_info_peso = testata_infopeso_id
        rp.persist()
        if testata_infopeso_id is not "None":
            daos = TestataInfoPeso().getRecord(id = testata_infopeso_id)
        else:
            daos = None
        item = {
            "Result":"OK",
            "Record": {"iprowId": rp.id,
                "iprowDataRegistrazione": "/Date("+str(1000*int(float(rp.data_registrazione.strftime('%s'))))+")/",
                "iprowPeso":str(mN(rp.peso,2) or "") ,
                "iprowDiffPeso":str(prova(rp, daos)) ,
                "iprowMassaGrassa": str(mN(rp.massa_grassa,2) or "") ,
                "iprowMassaGrassaEAcqua": str(mN(rp.massa_magra_e_acqua,2) or ""),
                "iprowAcqua": str(mN(rp.acqua,2) or "") ,
                "iprowTipoTrattamento": str(rp.tipotrattamento),
                "ipRowNote": str(rp.note or "")}
            }
        jasoned = json.dumps(item)
        return Response(jasoned)

    def __update_row__(req, dao=None, quarto=None):
        testata_infopeso_id = req.args.get("testata_infopeso_id")
        dao_tip = TestataInfoPeso().getRecord(id=testata_infopeso_id)
        idDaoRow = int(req.form.get("iprowId"))
        rp = RigaInfoPeso().getRecord(id=idDaoRow)
        #rp.peso = Decimal(str(req.form.get("iprowPeso").replace(",",".") or 0))
        rp.peso = float(str(req.form.get("iprowPeso").replace(",",".") or 0))

        if req.form.get("iprowMassaGrassa") :
            rp.massa_grassa = float(str(req.form.get("iprowMassaGrassa").replace(",",".") or 0))
        else:
            rp.massa_grassa = 0
        if req.form.get("iprowAcqua"):
            rp.acqua = float(str(req.form.get("iprowAcqua").replace(",",".") or 0))
        else:
            rp.acqua = 0
        if req.form.get("iprowMassaGrassaEAcqua"):
            rp.massa_magra_e_acqua = float(str(req.form.get("iprowMassaGrassaEAcqua").replace(",",".") or 0))
        else:
            rp.massa_magra_e_acqua = 0
        #rp.massa_grassa = Decimal(str(req.form.get("iprowMassaGrassa").replace(",",".") or 0))
        #rp.acqua = Decimal(str(req.form.get("iprowAcqua").replace(",",".") or 0))
        #rp.massa_magra_e_acqua = Decimal(str(req.form.get("iprowMassaGrassaEAcqua").replace(",",".") or 0))
        rp.note = str(req.form.get("ipRowNote") or "")
        d= req.form.get("iprowDataRegistrazione").split("-")
        rp.data_registrazione = datetime.datetime(int(d[2]),int(d[1]),int(d[0]))
        dao_tipo_trattamento = TipoTrattamento().select(denominazione= req.form.get("iprowTipoTrattamento"))
        rp.id_tipo_trattamento = dao_tipo_trattamento[0].id
        item = {"Result":"OK"}
        rp.id_testata_info_peso = testata_infopeso_id
        rp.persist()
        jasoned = json.dumps(item)
        return Response(jasoned)

    def __delete_row__(req, dao=None, quarto=None):
        """Cancella una riga alle pesate"""
        idDaoRow = int(req.form.get("iprowId"))
        dr = RigaInfoPeso().getRecord(id=idDaoRow)
        dr.delete()
        item = {"Result": "OK", }
        jasoned = json.dumps(item)
        return Response(jasoned)


    def __testata_add__(self, dao=None, quarto=None):
        """Aggiungiamo una testata infopeso """
        tip = req.form.get("tip_id")
        if tip is not None and tip !="None":
            dao_testata_infopeso = TestataInfoPeso().getRecord(id=tip)
        else:
            dao_testata_infopeso = TestataInfoPeso()
        dao_testata_infopeso.data_inizio= datetime.datetime.now()
        dao_testata_infopeso.data_fine = datetime.datetime.now()
        if req.form.get("privacy") == "1":
            dao_testata_infopeso.privacy = True
        else:
            dao_testata_infopeso.privacy = False
        #dao_testata_infopeso.privacy = req.form.get("privacy")
        dao_testata_infopeso.note = req.form.get("note") or ""
        dao_testata_infopeso.citta = req.form.get("citta")
        dao_testata_infopeso.id_cliente = req.form.get("id")
        dao_testata_infopeso.persist()
        tg = req.form.get("tg_id")
        if tg is not None and tg !="None":
            dao_generalita_infopeso = ClienteGeneralita().getRecord(id= tg)
        else:
            dao_generalita_infopeso = ClienteGeneralita()
        dao_generalita_infopeso.data_nascita = stringToDate(req.form.get("data_nascita"))
        dao_generalita_infopeso.altezza = req.form.get("altezza")
        dao_generalita_infopeso.genere = req.form.get("genere")
        dao_generalita_infopeso.id_cliente = req.form.get("id")
        dao_generalita_infopeso.persist()
        dao = Cliente().getRecord(id= req.form.get("id"))
        return setDao(req, dao=dao, dti=dao_testata_infopeso.id, dgi=dao_generalita_infopeso.id)


    if not quarto:
        if action == "infopeso_add":
            return __testata_add__(req, dao=dao, quarto=quarto)

        return setDao(req, dao=dao)
    elif quarto == "List":
        return __list_row__(req, dao=dao, quarto=quarto)
    elif quarto == "Create":
        return __create_row__(req, dao=dao, quarto=quarto)
    elif quarto == "Delete":
        return __delete_row__(req, dao=dao, quarto=quarto)
    elif quarto == "Update":
        return __update_row__(req, dao=dao, quarto=quarto)
    elif quarto == "GetTrattamenti":
        return __get_trattamenti__(req, dao=dao, quarto=quarto)
    elif quarto == "creaGrafico":
        return __crea_grafico__(req, dao=dao, quarto=quarto)
